package com.rong.juc_test.juc_p6_p7;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 可重入锁理解
 */
public class ReentrantDemo {
//    public static void main(String[] args) {
//        // 1.synchronized同步块 可重入:同一个线程可以重复获取同一把锁
//        final Object obj = new Object();
//        new Thread(() -> {
//            synchronized (obj){
//                System.out.println("syn进入第一层");
//                synchronized (obj){
//                    System.out.println("syn进入第二层");
//                    synchronized (obj){
//                        System.out.println("syn进入第三层");
//                    }
//                }
//            }
//        },"t1").start();
//    }

    // ------------------------------------------------------------------------------------------------------------------
//    // 2.同步方法
//    public synchronized void m1(){
//        System.out.println("m1进入第一层");
//        m2();
//    }
//
//    public synchronized void m2(){
//        System.out.println("m2进入第二层");
//        m3();
//    }
//
//    public synchronized void m3(){
//        System.out.println("m3进入第三层");
//    }
//
//    public static void main(String[] args) {
//        ReentrantDemo r = new ReentrantDemo();
//        new Thread(() -> {
//            r.m1();
//        },"t1").start();
//    }

    // ------------------------------------------------------------------------------------------------------------------
    //3. ReentrantLock可重入锁
    static Lock lock = new ReentrantLock();

    public static void main(String[] args) {
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("t1进入第一层");
                lock.lock();
                try{
                    System.out.println("t1进入第二层");
                    try {
                        lock.lock();
                        System.out.println("t1进入第三层");
                    }finally {
                        lock.unlock();
                    }
                }finally {
                    lock.unlock();
                }
            }finally {
                lock.unlock(); // 加所几次就要解锁几次 若存在多个线程 会导致线程死锁
            }
        }).start();
    }
    
}
